#include "bsp_config.h"

//将变量作用域限定在本C文件中，通过函数来操作变量
UI_Typedef Current_UI = STATUS_UI; //默认上电显示初次使用
UI_Typedef Prev_UI = UI_ALL;
bool IsChangeMenu = true; //默认是上电重绘的

POSITION_Typedef position_step = POSITION1;          //父位置
SUBPOSITION_Typedef subposition_step = SUBPOSITION1; //子位置

/**
 * @brief  设置显示界面类型
 * @param  ui:UI类型枚举变量
 * @retval 无
 */
void SetShowUI(UI_Typedef ui)
{
    Current_UI = ui;
    IsChangeMenu = true; //重绘界面
    TM1638_Clear();      //将LED数码管显示全部关闭
}

//危险时刻到来了

uint8_t percentage_of_repel_medicine = 0xFF;
uint8_t percentage_of_fumigate_medicine = 0xFF;

/**
 * @brief  显示当前剩余的药量   50ms
 * @param  refresh 1:表示立即刷新显示  0:表示当数据发生变化时显示
 * @retval 无
 */
void ShowMedicineQuantity(uint8_t refresh)
{
    uint16_t dat1, dat2;
    static uint8_t blink_cnt = 0; //药量闪烁用计数变量 4s一个周期

    dat1 = ConfigParam.RepelSetting.repel_sett_data.total_repel_time * 100UL / (HOURS_OF_REPEL * 3600L); //还剩百分之几的驱蚊药液  这里的时间是倒计时的
    dat2 = (TIMES_OF_MEDICINE - ConfigParam.PumpCnt.pump_cnt_data.pumpcnt) * 100L / TIMES_OF_MEDICINE;   //还剩百分之几的灭蚊药液  这里表示cnt自己相加
    
    if (Current_UI == STATUS_UI)
    {   //只有处于非设置界面时,才可以显示药量
        if (percentage_of_repel_medicine != dat1 || percentage_of_fumigate_medicine != dat2 || refresh == 1)
            {
                percentage_of_repel_medicine = dat1;
                percentage_of_fumigate_medicine = dat2;
                if (refresh == 0)
                { //如果是强制刷新就不用向APP发送消息
                    mqtt_pub_queue_enum = MQTT_SEND_REMAINS;
                    pMQTT_PUB_QUEUE_ENUM = &mqtt_pub_queue_enum; //这里得是一个全局变量
                    if (mqtt_is_connected == MQTT_CONNECTED)
                    {
                        xQueueSend(mqtt_pub_QueueHandler, (void *)&pMQTT_PUB_QUEUE_ENUM, portMAX_DELAY);
                    }
                }
                switch (ConfigParam.WorkingMode.work_mode_data.working_mode)
                {
                case ENUM_FUMIGATE_NORMAL_MODE:
                case ENUM_FUMIGATE_ENCHANCE_MODE:
                    if (notify_flag == 1)
                    { //药品没有装好,就将药量显示全部灭掉
                        LED_Potion_Quantity(100);
                    }
                    else
                    { //这里表示药品装好了
                        if (dat2 == 0)
                        {
                            LED_Potion_Quantity(0);
                        }
                        else if (dat2 > 0 && dat2 < 10)
                        {
                            LED_Potion_Quantity(1);
                        }
                        else if (dat2 >= 100)
                        {
                            LED_Potion_Quantity(10);
                        }
                        else
                        {
                            LED_Potion_Quantity((dat2 / 10)); //只显示药液量的整数部分  比如85% 就只显示8格   98%就只显示9格
                        }
                    }
                    break;
                case ENUM_REPEL_AIR_CONDI_MODE:
                case ENUM_REPEL_MATERNAL_MODE:
                case ENUM_REPEL_ENCHANCE_MODE:
                case ENUM_AROMA_MODE:
                    if (dat1 == 0)
                    {
                        LED_Potion_Quantity(0);
                    }
                    else if (dat1 > 0 && dat1 < 10)
                    {
                        LED_Potion_Quantity(1);
                    }
                    else if (dat1 >= 100)
                    {
                        LED_Potion_Quantity(10);
                    }
                    else
                    {
                        LED_Potion_Quantity((dat1 / 10)); //只显示药液量的整数部分  比如85% 就只显示8格   98%就只显示9格
                    }
                    break;
                default:
                    LED_Potion_Quantity(0);
                    break;
                } // switch
            }     // if
    }

/****************************************************这里表示药量小于10%的闪烁*************************************************/
    //当药量少于10%时,就会闪锁
    if (Current_UI == STATUS_UI)
    {                                 //只有处于非设置界面时,才可以在药量不足的情况下闪锁
        switch (ConfigParam.WorkingMode.work_mode_data.working_mode)
        {
        case ENUM_FUMIGATE_NORMAL_MODE:
        case ENUM_FUMIGATE_ENCHANCE_MODE:
            if (dat2 <= 10) //当灭蚊药量小于10%时
            {  //我只管当药量小于10%时的情况
                if (notify_flag == 1)
                { //药瓶没有装好,就什么也不显示
                    LED_Potion_Quantity(100);
                    return; //只要药瓶没有装好,就返回
                }
                else
                {
                    ++blink_cnt; // 50ms加一次  20次就是1s  40次就是2s
                    if (blink_cnt == 40)
                    { // 2s~4s之间全部灭调
                        LED_Potion_Quantity(100);
                    }
                    if (blink_cnt == 80)
                    { // 0s~2s之间显示药量
                        blink_cnt = 0;
                        if (dat2 == 0)
                        {   //这里表示没有药了
                            LED_Potion_Quantity(0);
                        }
                        else
                        {   //这里表示要药量  0<dat2<=10
                            LED_Potion_Quantity(1);
                        }
                    }
                }
            }
            break;
        case ENUM_REPEL_AIR_CONDI_MODE:
        case ENUM_REPEL_MATERNAL_MODE:
        case ENUM_REPEL_ENCHANCE_MODE:
        case ENUM_AROMA_MODE:
            if(dat1 <= 10) //当驱蚊药量小于10%时
            {  //我只管当药量小于10%时的情况
                ++blink_cnt; // 50ms加一次  20次就是1s  40次就是2s
                if (blink_cnt == 40)
                { // 2s~4s之间全部灭调
                    LED_Potion_Quantity(100);
                }
                if (blink_cnt == 80)
                { // 0s~2s之间显示药量
                    blink_cnt = 0;
                    if (dat1 == 0)
                    {   //这里表示没有药了
                        LED_Potion_Quantity(0);
                    }
                    else
                    {   //这里表示要药量  0<dat1<=10
                        LED_Potion_Quantity(1);
                    }
                }
            }
            break;
        } // switch
    }
    else
    {  //重置发生在设置界面
        if(RefillMark!=0)
        {
            if (blink_cnt ==0)
            { // 亮2s
                LED_Potion_Quantity(10);
            }   //40
            if (blink_cnt == 20)
            { // 灭1s
                LED_Potion_Quantity(100);
            }  //20

            if (blink_cnt == 40)
            { // 亮2s
                LED_Potion_Quantity(10);
            }  //40
            if (blink_cnt == 60)
            { // 灭1s
                LED_Potion_Quantity(100);
        
                beep_queue_enum = BEEP_500MS;
                pBEEP_QUEUE_ENUM = &beep_queue_enum;
                xQueueSend(beep_QueueHandler, (void *)&pBEEP_QUEUE_ENUM, portMAX_DELAY);
            }  //20

            if (blink_cnt == 80)
            { // 亮2s
                LED_Potion_Quantity(10);
            }  //40s

            if (blink_cnt == 100)
            { // 灭1s
                LED_Potion_Quantity(100);
            }
            if (blink_cnt == 120)
            { // 灭1s
                LED_Potion_Quantity(10);
                RefillMark=0;
                blink_cnt=0;
            }
            ++blink_cnt; // 50ms加一次  20次就是1s  40次就是2s    60次就是3s
        }
        else
        {
            blink_cnt = 0; //药量闪烁用计数变量 4s一个周期
        }
    }
/******************************************************************************************************************/

}

/********************************************************Area_Sett_UI********************************************/
/**
 * @brief  面积设置显示界面
 * @param  无
 * @retval 无
 */
static void Area_Sett_Show(void)
{
    static uint8_t cnt1 = 0;
    static uint8_t blink1 = 0;

    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        cnt1++;
        if (cnt1 >= 10)
        { // 500ms翻转一次
            cnt1 = 0;
            if (blink1 == 1)
            {               //这里是关
                blink1 = 0; //主要是

                LED_Repel(0);
                LED_Fumigate(0);
                LED_Aroma(0);

                LED_Area(0);

                TM1638_Up_Num_Show(fumigate_area, 10, 0, 0); //前面3个参数不重要
                LED_m2(0);
            }
            else if (blink1 == 0)
            { //这里是开
                blink1 = 1;

                LED_Area(1);
                LED_m2(1);
                switch (ConfigParam.WorkingMode.work_mode_data.working_mode)
                {
                case ENUM_FUMIGATE_NORMAL_MODE:
                case ENUM_FUMIGATE_ENCHANCE_MODE:
                    LED_Fumigate(1);
                    TM1638_Up_Num_Show(fumigate_area, 10, 0, 1);
                    break;
                case ENUM_REPEL_AIR_CONDI_MODE:
                case ENUM_REPEL_MATERNAL_MODE:
                case ENUM_REPEL_ENCHANCE_MODE:
                    LED_Repel(1);
                    TM1638_Up_Num_Show(repel_area, 10, 0, 1);
                    break;
                case ENUM_AROMA_MODE:
                    LED_Aroma(1);
                    TM1638_Up_Num_Show(repel_area, 10, 0, 1);
                    break;
                default:
                    LED_Repel(0);
                    LED_Fumigate(0);
                    LED_Aroma(0);
                    TM1638_Up_Num_Show(fumigate_area, 10, 0, 0); //前面3个参数不重要
                    break;
                } // switch
            }     // else if
            // TM1638_Show_Refresh();
        } // if
        /************************************************上面是针对LED灯闪烁的*********************************************/
    } // if
}

/**
 *	@brief  5_15m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Fumigate_Area5_15m2(void)
{
    ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area = ENUM_0_15_M2_F;
    write_config_param(&ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height, ConfigParam.FumigateSetting.pC, ConfigParam.FumigateSetting.length);
    Fumigate_Area_Refresh();
}

/**
 *	@brief  15_30m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Fumigate_Area15_30m2(void)
{
    ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area = ENUM_15_30_M2_F;
    write_config_param(&ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height, ConfigParam.FumigateSetting.pC, ConfigParam.FumigateSetting.length);
    Fumigate_Area_Refresh();
}

/**
 *	@brief  30_50m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Fumigate_Area30_50m2(void)
{
    ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area = ENUM_30_50_M2_F;
    write_config_param(&ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height, ConfigParam.FumigateSetting.pC, ConfigParam.FumigateSetting.length);
    Fumigate_Area_Refresh();
}

/**
 *	@brief  50_80m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Fumigate_Area50_80m2(void)
{
    ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area = ENUM_50_80_M2_F;
    write_config_param(&ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height, ConfigParam.FumigateSetting.pC, ConfigParam.FumigateSetting.length);
    Fumigate_Area_Refresh();
}

/**
 *	@brief  80_100m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Fumigate_Area80_100m2(void)
{
    ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area = ENUM_80_100_M2_F;
    write_config_param(&ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height, ConfigParam.FumigateSetting.pC, ConfigParam.FumigateSetting.length);
    Fumigate_Area_Refresh();
}

/**
 *	@brief  100_150m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Fumigate_Area100_150m2(void)
{
    ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area = ENUM_100_150_M2_F;
    write_config_param(&ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height, ConfigParam.FumigateSetting.pC, ConfigParam.FumigateSetting.length);
    Fumigate_Area_Refresh();
}

/**
 *	@brief  150_200m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Fumigate_Area150_200m2(void)
{
    ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area = ENUM_150_200_M2_F;
    write_config_param(&ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height, ConfigParam.FumigateSetting.pC, ConfigParam.FumigateSetting.length);
    Fumigate_Area_Refresh();
}
/**********************************************************************************/

/**
 *	@brief  0_10m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Repel_Area0_10m2(void)
{
    ConfigParam.RepelSetting.repel_sett_data.repel_sett_area = ENUM_BENEATH_10M2;
    write_config_param(&ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode, ConfigParam.RepelSetting.pC, ConfigParam.RepelSetting.length);
    Repel_Area_Refresh();
}

/**
 *	@brief  10_20m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Repel_Area10_20m2(void)
{
    ConfigParam.RepelSetting.repel_sett_data.repel_sett_area = ENUM_10_20_M2;
    write_config_param(&ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode, ConfigParam.RepelSetting.pC, ConfigParam.RepelSetting.length);
    Repel_Area_Refresh();
}

/**
 *	@brief  21_30m2面积选择
 *	@param	无
 *	@return	无
 */
void Set_Repel_Area21_30m2(void)
{
    ConfigParam.RepelSetting.repel_sett_data.repel_sett_area = ENUM_21_30_M2;
    write_config_param(&ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode, ConfigParam.RepelSetting.pC, ConfigParam.RepelSetting.length);
    Repel_Area_Refresh();
}

/**
 * @brief  切换当前面积
 * @param  无
 * @retval 无
 */
static void Area_Sett_Shift(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_FUMIGATE_NORMAL_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_FUMIGATE_ENCHANCE_MODE)
        { //这里是针对灭蚊的
            switch (ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area)
            {
            case ENUM_0_15_M2_F:
                Set_Fumigate_Area15_30m2();
                break;
            case ENUM_15_30_M2_F:
                Set_Fumigate_Area30_50m2();
                break;
            case ENUM_30_50_M2_F:
                Set_Fumigate_Area50_80m2();
                break;
            case ENUM_50_80_M2_F:
                Set_Fumigate_Area80_100m2();
                break;
            case ENUM_80_100_M2_F:
                if (ConfigParam.PumpCnt.pump_cnt_data.type == NORMAL_MEDICINE)
                {
                    Set_Fumigate_Area5_15m2();
                }
                else if (ConfigParam.PumpCnt.pump_cnt_data.type == MEDIAN_MEDICINE)
                {
                    Set_Fumigate_Area100_150m2();
                }
                else if (ConfigParam.PumpCnt.pump_cnt_data.type == ENCHANCE_MEDICINE)
                {
                    Set_Fumigate_Area100_150m2();
                }
                break;
            case ENUM_100_150_M2_F:
                if (ConfigParam.PumpCnt.pump_cnt_data.type == NORMAL_MEDICINE)
                {
                    Set_Fumigate_Area5_15m2();
                }
                else if (ConfigParam.PumpCnt.pump_cnt_data.type == MEDIAN_MEDICINE)
                {
                    Set_Fumigate_Area5_15m2();
                }
                else if (ConfigParam.PumpCnt.pump_cnt_data.type == ENCHANCE_MEDICINE)
                {
                    Set_Fumigate_Area150_200m2();
                }
                break;
            case ENUM_150_200_M2_F:
                if (ConfigParam.PumpCnt.pump_cnt_data.type == NORMAL_MEDICINE)
                {
                    Set_Fumigate_Area5_15m2();
                }
                else if (ConfigParam.PumpCnt.pump_cnt_data.type == MEDIAN_MEDICINE)
                {
                    Set_Fumigate_Area5_15m2();
                }
                else if (ConfigParam.PumpCnt.pump_cnt_data.type == ENCHANCE_MEDICINE)
                {
                    Set_Fumigate_Area5_15m2();
                }
                break;
            default:
                Set_Fumigate_Area5_15m2();
                break;
            }
        }
        else if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_AIR_CONDI_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_MATERNAL_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_ENCHANCE_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_AROMA_MODE)
        { //这里是针对
            switch (ConfigParam.RepelSetting.repel_sett_data.repel_sett_area)
            {
            case ENUM_BENEATH_10M2:
                Set_Repel_Area10_20m2();
                break;
            case ENUM_10_20_M2:
                Set_Repel_Area21_30m2();
                break;
            case ENUM_21_30_M2:
                Set_Repel_Area0_10m2();
                break;
            default:
                Set_Repel_Area0_10m2();
                break;
            }
        }
    }
}

static void Area_Sett_UI(void) //这里是面积设置界面
{
    static uint16_t timeout = 0;

    if (Current_UI != Prev_UI || IsChangeMenu == true)
    { //更换界面之前得清显示
        Prev_UI = Current_UI;
        IsChangeMenu = false;
        //这里写得初次显示的东西
        Status_LED_Show();          //主要是让一些提示显示出来
        Status_WorkingTime_Show(1); //立即刷新
        ShowMedicineQuantity(1);
    }
    Area_Sett_Show();           //设置时上面显示面积
    Status_WorkingTime_Show(0); //下面显示时间
    ShowMedicineQuantity(0);
    switch (GetCurrentKeyState())
    {
    case SET_KET_PRESS:         // set键短按
        timeout = 0;            //短按set键退出面积设置
        if(shiftkey_shortcut || upkey_shortcut)
        {
            shiftkey_shortcut=0;
            upkey_shortcut=0;
            position_step = POSITION1; //光标值归位置
            SetShowUI(STATUS_UI);      //回到正常状态
        }
        else
        {
            Status_Enter_Setting(); //根据当前的工作模式退回到相应的界面
        }
        break;
    case SHIFT_KEY_PRESS: // shift键短按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_PRESS: // inc键短按
        timeout = 0;
        Area_Sett_Shift(); //切换面积
        break;

    case SET_KEY_LONG_PRESS_2S:    // set键长按
        timeout = 0;               //
        position_step = POSITION1; //光标值归位置
        SetShowUI(STATUS_UI);      //回到正常状态
        //这里暂时没有功能
        break;
    case SHIFT_KEY_LONG_PRESS_2S: // shift键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_LONG_PRESS_2S: // inc键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    default:
        break;
    }
}
/********************************************************************************************************************/

/********************************************************Height_Sett_UI********************************************/
uint8_t height_index = 1; //默认是在十位进行设置的
uint16_t height_arr[3] = {0x00, 0x00, 0x00};
uint16_t height_buff = 0;
/**
 * @brief  层高设置光标切换(在十位,个位,个位 之间切换)
 * @param  无
 * @retval 无
 */
static void Height_Sett_Shift(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (height_index)
        {
        case 1:
            height_index = 2; //在个位进行设置
            break;
        case 2:
            height_index = 3; //在小数点进行设置
            break;
        case 3:
            height_index = 1; //在十位进行设置
            break;
        default:
            break;
        }
    }
}

/**
 * @brief  层高设置加(根据height_index来进行加操作)
 * @param  无
 * @retval 无
 */
static void height_Sett_Inc(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        height_arr[0] = height_buff / 100 % 10;
        height_arr[1] = height_buff / 10 % 10;
        height_arr[2] = height_buff / 1 % 10;
        switch (height_index)
        {
        case 1: //在十位进行设置
            height_arr[0]++;
            if (height_arr[0] > 9)
            {
                height_arr[0] = 0;
            }
            break;
        case 2: //在个位进行设置
            height_arr[1]++;
            if (height_arr[1] > 9)
            {
                height_arr[1] = 0;
            }
            break;
        case 3: //在小数位进行设置
            height_arr[2]++;
            if (height_arr[2] > 9)
            {
                height_arr[2] = 0;
            }
            break;
        default:
            break;
        }
        height_buff = height_arr[0] * 100 + height_arr[1] * 10 + height_arr[2];
    }
}

/**
 * @brief  层高设置显示界面 层高仅仅针对灭蚊
 * @param  无
 * @retval 无
 */
static void Height_Sett_Show(void)
{
    static uint8_t cnt1 = 0;
    static uint8_t blink1 = 0;

    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        cnt1++;
        if (cnt1 >= 10)
        { // 500ms翻转一次
            cnt1 = 0;
            if (blink1 == 1)
            {               //这里是关
                blink1 = 0; //主要是

                LED_Repel(0);
                LED_Fumigate(0);
                LED_Aroma(0);

                LED_Height(0);
                LED_m(0);
                TM1638_Up_Num_Show(height_buff, 10, 1, 1); //前面3个参数不重要
            }
            else if (blink1 == 0)
            { //这里是开
                blink1 = 1;

                LED_Fumigate(1);
                LED_Height(1);
                LED_m(1);

                switch (height_index)
                {
                case 1:
                    //十位不显示,其它位全显示
                    TM1638_Up_Num_Show(height_buff, 10, 1, 2); //前面3个参数不重要
                    break;
                case 2:
                    //个位不显示,其它位全显示
                    TM1638_Up_Num_Show(height_buff, 10, 1, 3); //前面3个参数不重要
                    break;
                case 3:
                    //小数位不显示,其它位全显示
                    TM1638_Up_Num_Show(height_buff, 10, 1, 4); //前面3个参数不重要
                    break;
                default:
                    break;
                }
            } // else if
            // TM1638_Show_Refresh();
        } // if
        /************************************************上面是针对LED灯闪烁的*********************************************/
    } // if
}

static void Height_Sett_UI(void) //这里是高度设置界面
{
    static uint16_t timeout = 0;

    if (Current_UI != Prev_UI || IsChangeMenu == true)
    { //更换界面之前得清显示
        Prev_UI = Current_UI;
        IsChangeMenu = false;
        //这里写得初次显示的东西
        Status_LED_Show();          //主要是让一些提示显示出来
        Status_WorkingTime_Show(1); //立即刷新
        ShowMedicineQuantity(1);
        height_buff = (uint16_t)(ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height * 10);
    }
    Height_Sett_Show();         //设置时上面显示高度
    Status_WorkingTime_Show(0); //下面显示时间
    ShowMedicineQuantity(0);
    switch (GetCurrentKeyState())
    {
    case SET_KET_PRESS: // set键短按
        timeout = 0;    //退回到上一级
        Status_Enter_Setting();
        break;
    case SHIFT_KEY_PRESS: // shift键短按
        timeout = 0;
        Height_Sett_Shift();
        break;
    case INC_KEY_PRESS: // inc键短按
        timeout = 0;
        height_Sett_Inc();
        break;

    case SET_KEY_LONG_PRESS_2S: // set键长按
        timeout = 0;            //长按SET键进入具体的模式,并进行设置
        Status_Enter_Setting();
        break;
    case SHIFT_KEY_LONG_PRESS_2S: // shift键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_LONG_PRESS_2S: // inc键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    default:
        break;
    }
}
/********************************************************************************************************************/

/********************************************************Timing_Sett_UI********************************************/

uint8_t time_sett_index = 0; //默认光标处于小时上  0:小时  1:分钟
struct timeval tv;
struct tm sett_time;
/**
 * @brief  时间设置加(主要是对时间进行加1操作)
 *         进行操作前得先知道操作时间的API
 * @param  无
 * @retval 无
 */
static void Time_Sett_Inc(void)
{
    if (subposition_step == SUBPOSITION1)
    { //
        if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_TIMING)
        {
            ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode = ENUM_MOS_REPEL_NORMAL;
        }
        else if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_NORMAL)
        {
            ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode = ENUM_MOS_REPEL_TIMING;
        }
        write_config_param(&ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode, ConfigParam.RepelSetting.pC, ConfigParam.RepelSetting.length);
    }
    else if (subposition_step == SUBPOSITION2)
    {
        if (time_sett_index == 0)
        {
            sett_time.tm_hour++;
            if (sett_time.tm_hour > 23)
            {
                sett_time.tm_hour = 0;
            }
        }
        else if (time_sett_index == 1)
        {
            sett_time.tm_min++;
            if (sett_time.tm_min > 59)
            {
                sett_time.tm_min = 0;
            }
        }
    }
    else
    {
        sett_time.tm_hour++;
        if (sett_time.tm_hour > 23)
        {
            sett_time.tm_hour = 0;
        }
    }
}

/**
 * @brief  时间设置光标切换(在小时和分钟之间切换)
 * @param  无
 * @retval 无
 */
static void Time_Sett_Shift(void)
{
    if (time_sett_index == 0)
    {
        time_sett_index = 1;
    }
    else if (time_sett_index == 1)
    {
        time_sett_index = 0;
    }
}

/**
 * @brief  时间设置,在当前时间,开始时间,结束时间之间来回切换
 * @param  无
 * @retval 无
 */
static void Time_Sett(void)
{
    struct timeval tv;

    switch (subposition_step)
    {
    case SUBPOSITION1: //
        if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_TIMING)
        { //当前处于定时模式时,才可继续进行下一步
            time_sett_index = 0;
            subposition_step = SUBPOSITION2; //
        }
        else if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_NORMAL)
        { //当前处于正常模式时,将会直接退出
            time_sett_index = 0;
            subposition_step = SUBPOSITION1;
            //这里得进行退出
            Status_Enter_Setting();
        }
        break;
    case SUBPOSITION2:
        //这里可以进行存储
        sett_time.tm_sec = current_time.tm_sec;
        tv.tv_sec = mktime(&sett_time);
        tv.tv_usec = 0;
        // tv.tv_sec=tv.tv_sec-(current_time.tm_hour* 60UL * 60UL+current_time.tm_min * 60UL);
        printf("sett_time.tm_hour:%d sett_time.tm_min:%d\n", sett_time.tm_hour, sett_time.tm_min);
        sntp_sync_time(&tv);

        time_sett_index = 0;
        subposition_step = SUBPOSITION3; //
        sett_time.tm_hour = ConfigParam.RepelSetting.repel_sett_data.repel_sett_timing.Start_Hour;
        sett_time.tm_min = 0;
        break;
    case SUBPOSITION3:
        //这里可以进行存储
        ConfigParam.RepelSetting.repel_sett_data.repel_sett_timing.Start_Hour = sett_time.tm_hour;
        write_config_param(&ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode, ConfigParam.RepelSetting.pC, ConfigParam.RepelSetting.length);
        time_sett_index = 0;
        subposition_step = SUBPOSITION4;
        sett_time.tm_hour = ConfigParam.RepelSetting.repel_sett_data.repel_sett_timing.End_Hour;
        sett_time.tm_min = 0;
        break;
    case SUBPOSITION4:
        //这里可以进行存储
        ConfigParam.RepelSetting.repel_sett_data.repel_sett_timing.End_Hour = sett_time.tm_hour;
        write_config_param(&ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode, ConfigParam.RepelSetting.pC, ConfigParam.RepelSetting.length);
        time_sett_index = 0;
        subposition_step = SUBPOSITION1;
        //这里得进行退出
        Status_Enter_Setting();
        break;
    default:
        break;
    }
}

/**
 * @brief  时间设置显示界面
 * @param  无
 * @retval 无
 */
static void Time_Sett_Show(void)
{
    static uint8_t cnt1 = 0;
    static uint8_t blink1 = 0;

    // subposition_step = SUBPOSITION1;

    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        cnt1++;
        if (cnt1 >= 10)
        { // 500ms翻转一次
            cnt1 = 0;
            if (blink1 == 1)
            {               //这里是关
                blink1 = 0; //主要是

                LED_Repel(0);
                LED_Fumigate(0); //不可能的情况
                LED_Aroma(0);

                LED_Timing(0);

                if (subposition_step == SUBPOSITION1)
                {                                                                 //
                    TM1638_Down_Num_Show(sett_time.tm_hour, sett_time.tm_min, 0); //全关
                }
                else if (subposition_step == SUBPOSITION2)
                { //
                    if (time_sett_index == 0)
                    { // hour_sett不显示,minute_sett显示
                        TM1638_Down_Num_Show(sett_time.tm_hour, sett_time.tm_min, 2);
                    }
                    else if (time_sett_index == 1)
                    { // hour_sett显示,minute_sett不显示
                        TM1638_Down_Num_Show(sett_time.tm_hour, sett_time.tm_min, 3);
                    }
                }
                else if (subposition_step == SUBPOSITION3 || subposition_step == SUBPOSITION4)
                { // hour_sett不显示,minute_sett显示
                    TM1638_Down_Num_Show(sett_time.tm_hour, sett_time.tm_min, 2);
                }
            }
            else if (blink1 == 0)
            { //这里是开
                blink1 = 1;

                LED_Timing(1);
                switch (ConfigParam.WorkingMode.work_mode_data.working_mode)
                {
                case ENUM_REPEL_AIR_CONDI_MODE:
                case ENUM_REPEL_MATERNAL_MODE:
                case ENUM_REPEL_ENCHANCE_MODE:
                    LED_Repel(1);
                    break;
                case ENUM_AROMA_MODE:
                    LED_Aroma(1);
                    break;
                default:
                    LED_Repel(1);
                    break;
                } // switch
                if (subposition_step == SUBPOSITION1)
                { //
                    if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_TIMING)
                    {                                                                 //显示ON
                        TM1638_Down_Num_Show(sett_time.tm_hour, sett_time.tm_min, 4); //前面3个参数不重要
                    }
                    else if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_NORMAL)
                    {                                                                 //显示OFF
                        TM1638_Down_Num_Show(sett_time.tm_hour, sett_time.tm_min, 5); //前面3个参数不重要
                    }
                }
                else
                {
                    TM1638_Down_Num_Show(sett_time.tm_hour, sett_time.tm_min, 1); //前面3个参数不重要
                }
            } // else if
            // TM1638_Show_Refresh();
        } // if
    }     // if
} // Time_Sett_Show

static void Timing_Sett_UI(void) //这里是定时设置界面
{
    static uint16_t timeout = 0;

    if (Current_UI != Prev_UI || IsChangeMenu == true)
    { //更换界面之前得清显示
        Prev_UI = Current_UI;
        IsChangeMenu = false;
        //这里写得初次显示的东西
        Status_LED_Show();  //刷新显示
        Status_M2_M_Show(); //处于非灭蚊状态时,上面的LED显示的是面积
        ShowMedicineQuantity(1);
        get_time(0); //获取当前时间
        sett_time = current_time;
        time_sett_index = 0;
        subposition_step = SUBPOSITION1;
    }
    Time_Sett_Show(); //
    ShowMedicineQuantity(0);
    switch (GetCurrentKeyState())
    {
    case SET_KET_PRESS: // set键短按
        timeout = 0;    //在Timing_Sett_UI界面按set键,会进行存储操作
        //这里是进行切换,在当前时间,开始时间,结束时间之间来回切换
        Time_Sett();
        break;
    case SHIFT_KEY_PRESS: // shift键短按
        timeout = 0;
        Time_Sett_Shift();
        break;
    case INC_KEY_PRESS: // inc键短按
        timeout = 0;
        Time_Sett_Inc();
        break;

    case SET_KEY_LONG_PRESS_2S: // set键长按
        timeout = 0;            //长按SET键进入具体的模式,并进行设置
        Status_Enter_Setting(); //这里是退出时间设置
        break;
    case SHIFT_KEY_LONG_PRESS_2S: // shift键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_LONG_PRESS_2S: // inc键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    default:
        break;
    }
}
/********************************************************************************************************************/

/********************************************************Repel_Sett_UI************************************************/
/**
 * @brief  在驱蚊设置界面选择(空调,母婴,面积,定时)
 * @param  无
 * @retval 无
 */
static void RepelSett_Shift_Position(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (position_step)
        {
        case POSITION1: //由空调->母婴
            position_step = POSITION2;
            break;
        case POSITION2: //由母婴->药量重置
            position_step = POSITION3;
            break;
        case POSITION3: //由药量重置->面积
            position_step = POSITION4;
            break;
        case POSITION4: //由面积->定时 
            position_step = POSITION5;
            break;
        case POSITION5: //由定时->空调
            position_step = POSITION1;
            break;
        default:
            position_step = POSITION1;
            break;
        }
    }
}

uint8_t RefillMark=0;  //当RefillMark等于非0时表示驱蚊香薰药量刚重置完成，相关的LED灯得闪烁,然后蜂鸣器得长叫

/**
 * @brief  position菜单确认(确认哪一个position菜单被按下)
 * @param  无
 * @retval 无
 */
static void RepelSett_Set_Position(void)
{ //这里只是动作,不显示
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (position_step)
        {
        case POSITION1:                                                                      //空调
            ConfigParam.WorkingMode.work_mode_data.working_mode = ENUM_REPEL_AIR_CONDI_MODE; //当前是空调模式
            ConfigParam.WorkingMode.work_mode_data.repel_buf_mode = ENUM_REPEL_AIR_CONDI_MODE;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            //返回上一个界面
            // position_step = POSITION1; //光标值归位置
            SetShowUI(STATUS_UI);
            break;
        case POSITION2:                                                                     //母婴
            ConfigParam.WorkingMode.work_mode_data.working_mode = ENUM_REPEL_MATERNAL_MODE; //当前是母婴模式
            ConfigParam.WorkingMode.work_mode_data.repel_buf_mode = ENUM_REPEL_MATERNAL_MODE;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            //返回上一个界面
            // position_step = POSITION1; //光标值归位置
            SetShowUI(STATUS_UI);
            break;
        case POSITION3: //这里变成药量重置
            // position_step = POSITION1; //光标值归位置
            // SetShowUI(AREA_SETT_UI);
            RefillRepelMedicine();
            RefillMark=1;
            break;
        case POSITION4: //面积
            // position_step = POSITION1; //光标值归位置
            SetShowUI(AREA_SETT_UI);
            break;
        case POSITION5: //定时
            // position_step = POSITION1;       //光标值归位置
            subposition_step = SUBPOSITION1; //恢复默认,即首先显示当前时间
            SetShowUI(TIMING_SETT_UI);
            break;
        default:
            break;
        } // switch
    }     // if
} // RepelSett_Set_Position

/**
 * @brief  驱蚊设置状态LED显示函数   驱蚊是没有层高的
 * @param  无
 * @retval 无
 */
static void Repel_Sett_LED_Show(void)
{
    static uint8_t cnt1 = 0;
    static uint8_t blink1 = 0;
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        cnt1++;
        if (cnt1 >= 10)
        { // 500ms翻转一次
            cnt1 = 0;
            if (blink1 == 1)
            {
                blink1 = 0;   //主要是
                LED_Repel(0); //驱蚊模式指示灯关闭
            }
            else if (blink1 == 0)
            {
                blink1 = 1;
                LED_Repel(1); //驱蚊模式指示灯开启
            }                 // else if
        }
        /******************************上面是针对LED_Repel指示灯的*****************************/
        switch (position_step)
        {
        case POSITION1: //空调
            LED_AirConditioner(1);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(0);
            LED_Potion_Quantity(100);
            break;
        case POSITION2: //母婴
            LED_AirConditioner(0);
            LED_Maternal(1);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(0);
            LED_Potion_Quantity(100);
            break;
        case POSITION3: //药量重置
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(0);
            if(RefillMark==0)
            {   //搞毛线
                if (percentage_of_repel_medicine == 0)
                {
                    LED_Potion_Quantity(0);
                }
                else if (percentage_of_repel_medicine > 0 && percentage_of_repel_medicine < 10)
                {
                    LED_Potion_Quantity(1);
                }
                else if (percentage_of_repel_medicine >= 100)
                {
                    LED_Potion_Quantity(10);
                }
                else
                {
                    LED_Potion_Quantity((percentage_of_repel_medicine / 10)); //只显示药液量的整数部分  比如85% 就只显示8格   98%就只显示9格
                }
            }
            break;
        case POSITION4: //面积
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(1);
            LED_Potion_Quantity(100);
            break;
        case POSITION5: //定时
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(1);
            LED_Height(0);
            LED_Area(0);
            LED_Potion_Quantity(100);
            break;
        default:
            position_step = POSITION1;
            LED_AirConditioner(1);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(0);
            LED_Potion_Quantity(100);
            break;
        } // switch
        // TM1638_Show_Refresh();
    } // if
} // Repel_Sett_LED_Show

static void Repel_Sett_UI(void) //这里是驱蚊设置界面
{
    static uint16_t timeout = 0;

    if (Current_UI != Prev_UI || IsChangeMenu == true)
    { //更换界面之前得清显示
        Prev_UI = Current_UI;
        IsChangeMenu = false;
        //这里写得初次显示的东西
        Status_WorkingTime_Show(1); //
        ShowMedicineQuantity(1);
    }
    Status_M2_M_Show();         //
    Status_WorkingTime_Show(0); //
    Repel_Sett_LED_Show();
    ShowMedicineQuantity(0);
    switch (GetCurrentKeyState())
    {
    case SET_KET_PRESS: // set键短按
        timeout = 0;    //在Status界面短按set键启动/停止当前仪器
        IsChangeMenu = true;
        RepelSett_Set_Position();
        break;
    case SHIFT_KEY_PRESS: // shift键短按
        timeout = 0;
        RepelSett_Shift_Position(); //驱蚊界面下,其他具体功能选择
        break;
    case INC_KEY_PRESS: // inc键短按
        timeout = 0;
        //这里暂时没有功能
        break;
    case SET_KEY_LONG_PRESS_2S: // set键长按
        timeout = 0;            //长按SET键退出驱蚊设置
        //这里暂时没有功能
        position_step = POSITION1; //光标值归位置
        SetShowUI(STATUS_UI);      //回到正常状态
        break;
    case SHIFT_KEY_LONG_PRESS_2S: // shift键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_LONG_PRESS_2S: // inc键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    default:
        break;
    }
}
/********************************************************************************************************************/

/********************************************************Fumigate_Sett_UI********************************************/
/**
 * @brief  灭蚊设置状态LED显示函数   灭蚊是有层高的
 * @param  无
 * @retval 无
 */
static void Fumigate_Sett_LED_Show(void)
{
    static uint8_t cnt1 = 0;
    static uint8_t blink1 = 0;
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        cnt1++;
        if (cnt1 >= 10)
        { // 500ms翻转一次
            cnt1 = 0;
            if (blink1 == 1)
            {
                blink1 = 0;      //主要是
                LED_Fumigate(0); //灭蚊模式指示灯关闭
            }
            else if (blink1 == 0)
            {
                blink1 = 1;
                LED_Fumigate(1); //灭蚊模式指示灯开启
            }                    // else if
        }
        /******************************上面是针对LED_Fumigate指示灯的*****************************/
        switch (position_step)
        {
        case POSITION1: //面积
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(1);
            break;
        case POSITION2: //层高
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(1);
            LED_Area(0);
            break;
        default:
            position_step = POSITION1;
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(1);
            break;
        } // switch
        // TM1638_Show_Refresh();
    } // if
} // Fumigate_Sett_LED_Show

/**
 * @brief  position菜单确认(确认哪一个position菜单被按下)
 * @param  无
 * @retval 无
 */
static void Fumigate_Set_Position(void)
{ //这里只是动作,不显示
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (position_step)
        {
        case POSITION1: //面积
            // position_step = POSITION2; //光标值归位置
            MedicineBottleResistor(); //探测一次当前瓶盖的类型
            IsChangeMenu = true;
            SetShowUI(AREA_SETT_UI);
            break;
        case POSITION2: //层高
            // position_step = POSITION1; //光标值归位置
            SetShowUI(HEIGHT_SETT_UI);
            break;
        default:
            break;
        } // switch
    }     // if
} // Fumigate_Set_Position

/**
 * @brief  在灭蚊设置界面选择(面积,层高)
 * @param  无
 * @retval 无
 */
static void FumigateSett_Shift_Position(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (position_step)
        {
        case POSITION1: //由面积->层高
            position_step = POSITION2;
            break;
        case POSITION2: //由层高->面积
            position_step = POSITION1;
            break;
        default:
            position_step = POSITION1;
            break;
        }
    }
}

static void Fumigate_Sett_UI(void) //这里是熏蒸设置界面
{
    static uint16_t timeout = 0;

    if (Current_UI != Prev_UI || IsChangeMenu == true)
    { //更换界面之前得清显示
        Prev_UI = Current_UI;
        IsChangeMenu = false;
        //这里写得初次显示的东西
        Status_WorkingTime_Show(1);
        ShowMedicineQuantity(1);
    }
    Status_M2_M_Show(); //
    Status_WorkingTime_Show(0);
    Fumigate_Sett_LED_Show();
    ShowMedicineQuantity(0);
    switch (GetCurrentKeyState())
    {
    case SET_KET_PRESS: // set键短按
        timeout = 0;    //在Status界面短按set键启动/停止当前仪器
        Fumigate_Set_Position();
        break;
    case SHIFT_KEY_PRESS: // shift键短按
        timeout = 0;
        FumigateSett_Shift_Position();
        break;
    case INC_KEY_PRESS: // inc键短按
        timeout = 0;
        //这里暂时没有功能
        break;

    case SET_KEY_LONG_PRESS_2S:    // set键长按
        position_step = POSITION1; //光标值归位置
        SetShowUI(STATUS_UI);      //回到正常状态
        break;
    case SHIFT_KEY_LONG_PRESS_2S: // shift键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_LONG_PRESS_2S: // inc键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    default:
        break;
    }
}
/********************************************************************************************************************/

/********************************************************Aroma_Sett_UI***********************************************/
/**
 * @brief  在香薰设置界面选择(面积,定时)
 * @param  无
 * @retval 无
 */
static void AromaSett_Shift_Position(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (position_step)
        {  
        case POSITION1: //由药量重置->面积
            position_step = POSITION2;
            break;
        case POSITION2: //由面积->定时
            position_step = POSITION3;
            break;
        case POSITION3: //由定时->药量重置
            position_step = POSITION1;
            break;
        default:
            position_step = POSITION1;
            break;
        } // switch
    }     // if
} // AromaSett_Shift_Position

/**
 * @brief  position菜单确认(确认哪一个position菜单被按下)
 * @param  无
 * @retval 无
 */
static void AromaSett_Set_Position(void)
{ //这里只是动作,不显示
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (position_step)
        {
        case POSITION1: //药量重置
            RefillRepelMedicine();
            RefillMark=1;
            break;
        case POSITION2: //面积
            SetShowUI(AREA_SETT_UI);
            break;
        case POSITION3:                      //定时
            subposition_step = SUBPOSITION1; //恢复默认,即首先显示当前时间
            SetShowUI(TIMING_SETT_UI);
            break;
        default:
            break;
        } // switch
    }     // if
} // RepelSett_Set_Position

/**
 * @brief  香薰设置状态LED显示函数   香薰是没有层高的
 * @param  无
 * @retval 无
 */
static void Aroma_Sett_LED_Show(void)
{
    static uint8_t cnt1 = 0;
    static uint8_t blink1 = 0;
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        cnt1++;
        if (cnt1 >= 10)
        { // 500ms翻转一次
            cnt1 = 0;
            if (blink1 == 1)
            {
                blink1 = 0;   //主要是
                LED_Aroma(0); //香薰模式指示灯关闭
            }
            else if (blink1 == 0)
            {
                blink1 = 1;
                LED_Aroma(1); //香薰模式指示灯开启
            }                 // else if
        }
        /******************************上面是针对LED_Repel指示灯的*****************************/
        switch (position_step)
        {
        case POSITION1: //药量重置
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(0);
            if(RefillMark==0)
            {  //当药液重置完成后，才完全显示
                if (percentage_of_repel_medicine == 0)
                {
                    LED_Potion_Quantity(0);
                }
                else if (percentage_of_repel_medicine > 0 && percentage_of_repel_medicine < 10)
                {
                    LED_Potion_Quantity(1);
                }
                else if (percentage_of_repel_medicine >= 100)
                {
                    LED_Potion_Quantity(10);
                }
                else
                {
                    LED_Potion_Quantity((percentage_of_repel_medicine / 10)); //只显示药液量的整数部分  比如85% 就只显示8格   98%就只显示9格
                }
            }
            break;
        case POSITION2: //面积
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(1);
            LED_Potion_Quantity(100);
            break;
        case POSITION3: //定时
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(1);
            LED_Height(0);
            LED_Area(0);
            LED_Potion_Quantity(100);
            break;
        default:
            position_step = POSITION1;
            LED_AirConditioner(0);
            LED_Maternal(0);
            LED_Timing(0);
            LED_Height(0);
            LED_Area(1);
            LED_Potion_Quantity(100);
            break;
        } // switch
        // TM1638_Show_Refresh();
    } // if
} // Repel_Sett_LED_Show

/**
 *  @brief  这里是和驱蚊一样的
 *  @param  无
 *  @param  无
 */
static void Aroma_Sett_UI(void) //这里是香薰设置界面
{
    static uint16_t timeout = 0;

    if (Current_UI != Prev_UI || IsChangeMenu == true)
    { //更换界面之前得清显示
        Prev_UI = Current_UI;
        IsChangeMenu = false;
        //这里写得初次显示的东西
        // Status_LED_Show(); //这个不用了
        Status_WorkingTime_Show(1);
        ShowMedicineQuantity(1);
    }
    Aroma_Sett_LED_Show();
    Status_M2_M_Show();         //
    Status_WorkingTime_Show(0); //
    ShowMedicineQuantity(0);
    switch (GetCurrentKeyState())
    {
    case SET_KET_PRESS: // set键短按
        timeout = 0;    //在Status界面短按set键启动/停止当前仪器
        AromaSett_Set_Position();
        break;
    case SHIFT_KEY_PRESS: // shift键短按
        timeout = 0;
        AromaSett_Shift_Position(); //驱蚊界面下,其他具体功能选择
        break;
    case INC_KEY_PRESS: // inc键短按
        timeout = 0;
        //这里暂时没有功能
        break;

    case SET_KEY_LONG_PRESS_2S:    // set键长按
        position_step = POSITION1; //光标值归位置
        SetShowUI(STATUS_UI);      //回到正常状态
        break;
    case SHIFT_KEY_LONG_PRESS_2S: // shift键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_LONG_PRESS_2S: // inc键长按
        timeout = 0;
        //这里暂时没有功能
        break;
    default:
        break;
    }
}
/********************************************************************************************************************/

/********************************************************First_Use_UI************************************************/
// /**
//  * @brief  初次使用界面
//  * @param  无
//  * @retval 无
//  */
// void First_Use_UI(void)
// {
//     static uint16_t timeout = 0;

//     if (Current_UI != Prev_UI)
//     { //更换界面之前得清显示
//         Prev_UI = Current_UI;
//         //这里写得初次显示的东西

//     }
//     /**
//      *  这里写相关显示
//      */
//     switch (GetCurrentKeyState())
//     {
//         case SET_KET_PRESS:
//             timeout = 0;
//             SetShowUI(STATUS_UI);
//             break;
//         case SHIFT_KEY_PRESS:
//             timeout = 0;
//             SetShowUI(STATUS_UI);
//             break;
//         case INC_KEY_PRESS:
//             timeout = 0;
//             SetShowUI(STATUS_UI);
//             break;
//         default:
//             break;
//     }
//     //处于初次使用界面的时候,如果不触发按键或不使用手机控制,将一直处于这个界面
// }
/**********************************************************************************************************/

/***********************************************STATUS_UI**************************************************/
/*************************************************************************/

/**
 * @brief  开关机函数
 * @param  无
 * @retval 无
 */
static void SwitchFunction(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {               //当处于关机状态时,按下就会开启机器
        SwitchOn(); //开机
    }
    else
    {
        SwitchOff(); //关机
    }
}

/**
 * @brief  主要是在Status模式下对LED灯进行一些控制
 * @param  无
 * @retval 无
 */
void Status_LED_Show(void)
{
    /**************************************针对单个LED的*************************************/
    //这个是针对模式指示的   这里还得思考一下,哪些得灭,哪些得亮
    switch (ConfigParam.WorkingMode.work_mode_data.working_mode)
    {
    case ENUM_FUMIGATE_NORMAL_MODE:
    case ENUM_FUMIGATE_ENCHANCE_MODE:
        //这些无关的面积,层高,定时,空调,母婴,运行,都得灭掉
        LED_AirConditioner(0);
        LED_Maternal(0);
        LED_Run(0);
        LED_Timing(0);
        LED_Height(0);
        LED_Area(0);

        LED_Aroma(0);
        LED_Fumigate(1);
        LED_Repel(0);
        break;
    case ENUM_REPEL_AIR_CONDI_MODE:
    case ENUM_REPEL_MATERNAL_MODE:
    case ENUM_REPEL_ENCHANCE_MODE:
        //这些无关的面积,层高,定时,空调,母婴,运行,都得灭掉
        LED_Run(0);
        LED_Height(0);
        LED_Area(0);

        LED_Aroma(0);
        LED_Fumigate(0);
        LED_Repel(1);
        if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_AIR_CONDI_MODE)
        {
            LED_AirConditioner(1);
            LED_Maternal(0);
        }
        else if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_MATERNAL_MODE)
        {
            LED_AirConditioner(0);
            LED_Maternal(1);
        }
        else if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_ENCHANCE_MODE)
        {
            LED_AirConditioner(0); //当处于增强驱蚊模式时,空调和母婴图标会
            LED_Maternal(0);
        }

        if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_TIMING)
        {
            LED_Timing(1);
        }
        else if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_NORMAL)
        {
            LED_Timing(0);
        }
        break;
    case ENUM_AROMA_MODE:
        //这些无关的面积,层高,定时,空调,母婴,运行,都得灭掉
        LED_Run(0);
        LED_AirConditioner(0);
        LED_Maternal(0);
        LED_Height(0);
        LED_Area(0);
        LED_Aroma(1);
        LED_Fumigate(0);
        LED_Repel(0);
        if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_TIMING)
        {
            LED_Timing(1);
        }
        else if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_NORMAL)
        {
            LED_Timing(0);
        }
        break;
    default:
        LED_AirConditioner(0);
        LED_Maternal(0);
        LED_Run(0);
        LED_Timing(0);
        LED_Height(0);
        LED_Area(0);

        LED_Aroma(0);
        LED_Fumigate(0);
        LED_Repel(0);
        break;
    }
    /*****************************************************************************************/
    //上面无论是运行还是停止都得执行
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        LED_Run(0); //不工作时,运行指示灯是关闭的
    }
    else
    {
        LED_Run(1); //工作时,运行指示灯是开启的
    }
    // TM1638_Show_Refresh();
} // Status_LED_Show

/**
 * @brief  在Status模式下,显示面积和高度
 * @param  无
 * @retval 无
 */
void Status_M2_M_Show(void)
{
    /*****************************************************************************************/
    //这个是针对上部的数码管的
    if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_FUMIGATE_NORMAL_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_FUMIGATE_ENCHANCE_MODE)
    { //这里是针对灭蚊的
        static uint8_t cnt = 0xFF;
        static uint8_t alternate = 0;
        cnt++;
        if (cnt >= 40)
        { // 50ms*40=2s
            cnt = 0;

            if (alternate == 1)
            { //显示层高
                alternate = 0;
                TM1638_Up_Num_Show((uint16_t)(ConfigParam.FumigateSetting.fumi_sett_data.fumi_house_height * 10), 10, 1, 1);
                LED_m(1);
                LED_m2(0);
                // TM1638_Show_Refresh();
            }
            else if (alternate == 0)
            { //显示面积
                alternate = 1;
                TM1638_Up_Num_Show(fumigate_area, 10, 0, 1);
                LED_m(0);
                LED_m2(1);
                // TM1638_Show_Refresh();
            }
        }
    }
    else if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_AIR_CONDI_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_MATERNAL_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_ENCHANCE_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_AROMA_MODE)
    {
        //这里是针对驱蚊  只显示面积
        TM1638_Up_Num_Show(repel_area, 10, 0, 1);
        LED_m(0);
        LED_m2(1);
        // TM1638_Show_Refresh();
    }
    /******************************************************************************************/
} // Status_M2_M_Show

uint32_t repel_cnt = 0; //这个变量是用于计数的

/**
 * @brief  Status模式下显示时间(分为实时时间显示和工作时间显示)
 * @param  uint8_t refresh 1:表示立即刷新 0:表示当数据发生变化时显示
 * @retval 无
 */
void Status_WorkingTime_Show(uint8_t refresh)
{ //当前时间会每1s获取一次
    static uint8_t hour_buffer = 0xFF;
    static uint8_t minute_buffer = 0xFF;

    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    { //停机时只显示当前时间
        repel_cnt = 0;
        if (hour_buffer != current_time.tm_hour || minute_buffer != current_time.tm_min || refresh == 1)
        {
            hour_buffer = current_time.tm_hour;
            minute_buffer = current_time.tm_min;

            TM1638_Down_Num_Show(hour_buffer, minute_buffer, 1);
            // TM1638_Show_Refresh();
        }
    }
    else //工作时得分好几种模式
    {
        if (minute_buffer != current_time.tm_min || refresh == 1)
        { // 1分钟搞一次
            uint16_t hour_dat = 0;
            uint16_t minute_dat = 0;

            minute_buffer = current_time.tm_min;

            if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_FUMIGATE_NORMAL_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_FUMIGATE_ENCHANCE_MODE)
            {                                 //这里是针对灭蚊的       就是倒计时
                minute_dat = second_cnt / 60; //看看还剩几分钟
                hour_dat = minute_dat / 60;
                minute_dat = minute_dat % 60;

                TM1638_Down_Num_Show(hour_dat, minute_dat, 1);
                // TM1638_Show_Refresh();
            }
            else if (ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_AIR_CONDI_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_MATERNAL_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_REPEL_ENCHANCE_MODE || ConfigParam.WorkingMode.work_mode_data.working_mode == ENUM_AROMA_MODE)
            { //这里是针对驱蚊的       就是正计时
                if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_NORMAL)
                {                                //正常驱蚊模式
                    hour_dat = repel_cnt / 60;   //已经工作了多少小时
                    minute_dat = repel_cnt % 60; //已经工作了多少分钟
                    TM1638_Down_Num_Show(hour_dat, minute_dat, 1);
                    // TM1638_Show_Refresh();
                    if (refresh != 1)
                    {
                        repel_cnt++; //每1min执行一次
                    }
                }
                else if (ConfigParam.RepelSetting.repel_sett_data.repel_sett_mode == ENUM_MOS_REPEL_TIMING)
                { //定时驱蚊模式
                    if (mark == 1)
                    {                                //处于工作时间段内
                        hour_dat = repel_cnt / 60;   //已经工作了多少小时
                        minute_dat = repel_cnt % 60; //已经工作了多少分钟
                        TM1638_Down_Num_Show(hour_dat, minute_dat, 1);
                        // TM1638_Show_Refresh();
                        if (refresh != 1)
                        {
                            repel_cnt++; //每1min执行一次
                        }
                    }
                    else
                    {                                //没有在工作时间段内
                        hour_dat = repel_cnt / 60;   //已经工作了多少小时
                        minute_dat = repel_cnt % 60; //已经工作了多少分钟
                        TM1638_Down_Num_Show(hour_dat, minute_dat, 1);
                        // TM1638_Show_Refresh();
                        repel_cnt = 0;
                    } // else
                }     // else if
            }         // else if
        }             // if
    }                 // else
} // Status_WorkingTime_Show

/**
 * @brief  在Status模式下切换 驱蚊/灭蚊/香薰
 * @param  无
 * @retval 无
 */
void Status_Change_WorkingMode(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    { //这里得好好想一想
        switch (ConfigParam.WorkingMode.work_mode_data.working_mode)
        {
        case ENUM_FUMIGATE_NORMAL_MODE:
        case ENUM_FUMIGATE_ENCHANCE_MODE:
            ConfigParam.WorkingMode.work_mode_data.working_mode = ConfigParam.WorkingMode.work_mode_data.repel_buf_mode;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            break;
        case ENUM_REPEL_AIR_CONDI_MODE:
        case ENUM_REPEL_MATERNAL_MODE:
        case ENUM_REPEL_ENCHANCE_MODE:
            ConfigParam.WorkingMode.work_mode_data.working_mode = ENUM_AROMA_MODE;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            break;
        case ENUM_AROMA_MODE:
            ConfigParam.WorkingMode.work_mode_data.working_mode = ConfigParam.WorkingMode.work_mode_data.fumigate_buf_mode;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            break;
        default:
            ConfigParam.WorkingMode.work_mode_data.working_mode = ENUM_FUMIGATE_ENCHANCE_MODE;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            break;
        }
    }
} // Status_Change_WorkingMode

/**
 * @brief  根据当前模式,进入具体的设置界面
 * @param  无
 * @retval 无
 */
void Status_Enter_Setting(void)
{
    if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
    {
        switch (ConfigParam.WorkingMode.work_mode_data.working_mode)
        {
        case ENUM_FUMIGATE_NORMAL_MODE:
        case ENUM_FUMIGATE_ENCHANCE_MODE:
            SetShowUI(FUMIGATE_SETT_UI); //进入熏蒸设置界面
            break;
        case ENUM_REPEL_AIR_CONDI_MODE:
        case ENUM_REPEL_MATERNAL_MODE:
        case ENUM_REPEL_ENCHANCE_MODE:
            SetShowUI(REPEL_SETT_UI); //进入驱蚊设置界面
            break;
        case ENUM_AROMA_MODE:
            SetShowUI(AROMA_SETT_UI); //进入香薰设置界面
            break;
        default:
            SetShowUI(STATUS_UI); //进入Status界面
            break;
        }
    }
}

/**
 * @brief  指示当前wifi和ble的状态
 * @param  无
 * @retval 无
 */
void BLE_WIFI_LED_Indicate(void)
{   
    static uint8_t cnt = 0xFF;
    static uint8_t alternate = 0;

    if (ConfigParam.MQTT_Param.mqtt_param_data.wifi_mode == WIFI_SCANNING)
    {
        ++cnt;
        if (cnt >= 2)
        { // 2*50ms==100ms
            cnt = 0;
            if (alternate == 1)
            {
                alternate = 0;
                LED_BLE(0);
                LED_WiFi(1);
            }
            else if (alternate == 0)
            {
                alternate = 1;
                LED_BLE(0);
                LED_WiFi(0);
            }
        }
    }
    else if (ConfigParam.MQTT_Param.mqtt_param_data.wifi_mode == WIFI_CONNECT)
    {
        if (current_wifi_state == WIFI_CONED)
        {
            cnt = 0;
            alternate = 0;
            LED_BLE(0);
            LED_WiFi(1);
        }
        else if (current_wifi_state == WIFI_DISABLE)
        {
            cnt = 0;
            alternate = 0;
            LED_BLE(0);
            LED_WiFi(0);
        }
        else if (current_wifi_state == WIFI_CONN_ING)
        {
            ++cnt;
            if (cnt >= 10)
            { // 10*50ms==500ms
                cnt = 0;
                if (alternate == 1)
                {
                    alternate = 0;
                    LED_BLE(0);
                    LED_WiFi(1);
                }
                else if (alternate == 0)
                {
                    alternate = 1;
                    LED_BLE(0);
                    LED_WiFi(0);
                }
            }
        }
    }
}

uint8_t shiftkey_shortcut=0;
uint8_t upkey_shortcut=0;

/**
 * @brief  状态界面
 * @param  无
 * @retval 无
 */
void Status_UI(void)
{
    static uint16_t timeout = 0;

    if (Current_UI != Prev_UI || IsChangeMenu == true)
    { //更换界面之前得清显示
        Prev_UI = Current_UI;
        IsChangeMenu = false;
        //这里写得初次显示的东西
        Status_LED_Show();
        Status_WorkingTime_Show(1);
        ShowMedicineQuantity(1);
    }
    BLE_WIFI_LED_Indicate();
    Status_M2_M_Show(); //
    Status_WorkingTime_Show(0);
    ShowMedicineQuantity(0);
    switch (GetCurrentKeyState())
    {
    case SET_KET_PRESS: // set键短按
        timeout = 0;    //在Status界面短按set键启动/停止当前仪器
        SwitchFunction();
        break;
    case SHIFT_KEY_PRESS: // shift键短按
        timeout = 0;
        //这里暂时没有功能
        break;
    case INC_KEY_PRESS: // inc键短按
        timeout = 0;
        Status_Change_WorkingMode();
        IsChangeMenu = true;
        break;

    case SET_KEY_LONG_PRESS_2S: // set键长按
        timeout = 0;            //长按SET键进入具体的模式,并进行设置
        Status_Enter_Setting();
        break;
    case SHIFT_KEY_LONG_PRESS_4S: // shift键长按4s
        timeout = 0;
        // //蓝牙和WIFI之间切换
        // if (ConfigParam.BooleanMode.boolean_struct_data.wifi_or_ble == WIFI_ON)
        // {
        //     MosOpenBLE();
        // }
        // else if (ConfigParam.BooleanMode.boolean_struct_data.wifi_or_ble == BLE_ON)
        // {
        //     MosOpenWIFI();
        // }
        break;
    case INC_KEY_LONG_PRESS_4S: // inc键长按4s
        timeout = 0;
        //配网和WIFI连接之间切换
        SmartconfigOrWifiSta();
        break;
    case SHIFT_KEY_LONG_PRESS_2S: // shift键长按2s
        timeout = 0;
        if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
        { //这里得好好想一想
            shiftkey_shortcut=1;
            ConfigParam.WorkingMode.work_mode_data.working_mode = ConfigParam.WorkingMode.work_mode_data.repel_buf_mode;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            SetShowUI(AREA_SETT_UI);
        }
        break;
    case INC_KEY_LONG_PRESS_2S: // inc键长按2s
        timeout = 0;
        if (ConfigParam.WorkingStatus.working_status_data == ENUM_WORKING_STOP)
        { //这里得好好想一想
            upkey_shortcut=1;
            ConfigParam.WorkingMode.work_mode_data.working_mode = ConfigParam.WorkingMode.work_mode_data.fumigate_buf_mode;
            write_config_param(&ConfigParam.WorkingMode.work_mode_data.working_mode, ConfigParam.WorkingMode.pC, ConfigParam.WorkingMode.length);
            SetShowUI(AREA_SETT_UI);
        }
        break;
    default:
        break;
    }
}
/**********************************************************************************************************/

/**********************************************************************************************************/

/**********************************************************************************************************/

/**
 * @brief  显示驱动线程
 *  @param param :void 类型的指针
 * @retval 无
 */
void Display_Driver_Task(void *param)
{
    static uint8_t cnt = 0;
    static uint8_t qty = 0;
    while (1)
    {
        GetTemperature();
        ENCRYPTION_Adc();
        xSemaphoreTake(tm1638_mutex, portMAX_DELAY); //主要是防止和按键扫描线程抢夺资源
        switch (Current_UI)
        {
        // case FIRST_USE_UI: //上电显示的界面
        //     First_Use_UI();
        //     break;
        case STATUS_UI:  //除设置界面之外的界面,主要是运行指示
            Status_UI(); //一级
            break;

        case REPEL_SETT_UI:  //驱蚊设置界面
            Repel_Sett_UI(); //二级
            break;
        case FUMIGATE_SETT_UI:  //灭蚊设置界面
            Fumigate_Sett_UI(); //二级
            break;
        case AROMA_SETT_UI:  //香薰设置界面
            Aroma_Sett_UI(); //二级
            break;

        case AREA_SETT_UI: //面积设置界面                     //三级
            Area_Sett_UI();
            break;
        case HEIGHT_SETT_UI: //层高设置界面                   //三级
            Height_Sett_UI();
            break;
        case TIMING_SETT_UI: //定时设置界面                   //三级
            Timing_Sett_UI();
            break;
        default:
            Status_UI();
            break;
        }

        TM1638_Show_Refresh();
        xSemaphoreGive(tm1638_mutex);        //主要是防止和按键扫描线程抢夺资源
        vTaskDelay(50 / portTICK_PERIOD_MS); //显示部分每隔50ms刷新一次
    }
}

uint16_t fumigate_area = 0;
uint16_t repel_area = 0;

/**
 * @brief  灭蚊面积刷新
 * @param  无
 * @retval 无
 */
void Fumigate_Area_Refresh(void)
{
    switch (ConfigParam.FumigateSetting.fumi_sett_data.fumi_sett_area)
    {                    //下面根据设置选项，选择对应的药剂量
    case ENUM_0_15_M2_F: //房间面积  (0-15m2)
        fumigate_area = 15;
        break;
    case ENUM_15_30_M2_F: //房价面积  (15-30m2)
        fumigate_area = 30;
        break;
    case ENUM_30_50_M2_F: //房间面积  (30-50m2)
        fumigate_area = 50;
        break;
    case ENUM_50_80_M2_F: //房间面积  (50-80m2)
        fumigate_area = 80;
        break;
    case ENUM_80_100_M2_F: //房间面积  (80-100m2)
        fumigate_area = 100;
        break;
    case ENUM_100_150_M2_F: //房间面积  (100-150m2)
        fumigate_area = 150;
        break;
    case ENUM_150_200_M2_F: //房间面积  (150-200m2)
        fumigate_area = 200;
        break;
    default:
        fumigate_area = 200;
        break;
    }
}

/**
 * @brief  驱蚊面积刷新
 * @param  无
 * @retval 无
 */
void Repel_Area_Refresh(void)
{
    switch (ConfigParam.RepelSetting.repel_sett_data.repel_sett_area)
    {
    case ENUM_21_30_M2:
        repel_area = 30;
        break;
    case ENUM_10_20_M2:
        repel_area = 20;
        break;
    case ENUM_BENEATH_10M2:
        repel_area = 10;
        break;
    default:
        repel_area = 30;
        break;
    }
}

/**
 * @brief  界面显示初始化
 * @param  无
 * @retval 无
 */
void DisplayInit(void)
{
    Fumigate_Area_Refresh();
    Repel_Area_Refresh();
}
